.TITLE DRREG .IDENT /02.20/ ; ; Copyright (c) 1995-1999 by Mentec Inc., U.S.A. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; T. J. MILLER 12-MAR-76 ; ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY: ; ; J. M. LAWLER ; B. S. MCCARTHY ; T. M. MARTIN ; ; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY: ; ; J. M. LAWLER ; B. S. MCCARTHY ; ; MODIFIED FOR RSX-11M-PLUS VERSION 4.1 BY: ; ; B. S. MCCARTHY ; ; MODIFIED FOR RSX-11M-PLUS VERSION 4.3 BY: ; ; B. S. MCCARTHY 29-JUN-89 02.11 ; K. L. NOEL 7-JUL-89 02.12 ; ; MODIFIED FOR RSX-11M-PLUS VERSION 4.5 BY: ; ; D. CARROLL 15-MAY-1993 02.20 ; DC209 -- ALLOW FOR REGIONS TO BE CREATED TOPDOWN ; IF USED IN COMBINATION WITH RS.RES ; .PAGE ; ; THE FOLLOWING DIRECTIVES RECEIVE AS INPUT A POINTER TO A REGION DEFINITION ; BLOCK WHICH SERVES AS A COMMUNICATION AREA BETWEEN THE ISSUING TASK AND ; THE EXECUTIVE. THE REGION DEFINITION BLOCK HAS THE FOLLOWING FORMAT: ; ; ------------------------------------------------- ; ! ! ; R.GID ! REGION ID ! ; ! ! ; !-----------------------------------------------! ; ! ! ; R.GSIZ ! SIZE OF REGION (32W BLOCKS) ! ; ! ! ; !-----------------------------------------------! ; ! ! ; ! ! ; ! ! ; R.GNAM ! NAME OF REGION (RAD50) ! ; ! ! ; ! ! ; ! ! ; !-----------------------------------------------! ; ! ! ; ! ! ; ! ! ; R.GPAR ! REGION'S MAIN PARTITION NAME (RAD50) ! ; ! ! ; ! ! ; ! ! ; !-----------------------------------------------! ; ! ! ; R.GSTS ! REGION STATUS WORD ! ; ! ! ; !-----------------------------------------------! ; ! ! ; R.GPRO ! PROTECTION CODE OF REGION ! ; ! ! ; ------------------------------------------------- ; .IF DF P$$LAS ; ; MACRO LIBRARY CALLS ; .MCALL HDRDF$,PCBDF$,RDBDF$,TCBDF$ HDRDF$ ;DEFINE HEADER AND WINDOW BLOCK OFFSETS PCBDF$ ;DEFINE PCB AND ATTACHMENT DESCRIPTOR OFFSETS RDBDF$ ;DEFINE REGION DEFINITION BLOCK OFFSETS TCBDF$ ;DEFINE TCB OFFSETS ;+ ; **-$DRCRR-CREATE REGION ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CREATE A REGION AND OPTIONALLY ; ATTACH TO IT. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(55.),DPB SIZE(2.) ; WD. 01 -- ADDRESS OF REGION DEFINITION BLOCK ; ; INPUTS: ; ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE REGION DEFINITION BLOCK. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; INPUT FIELDS IN THE REGION DEFINITION BLOCK ARE: ; R.GSIZ=SIZE OF REGION TO CREATE. ; R.GNAM=NAME OF REGION TO CREATE OR 0 FOR NO NAME. ; R.GPAR=NAME OF SYSTEM PARTITION IN WHICH TO ALLOCATE REGION ; OR 0 FOR MAIN SYSTEM PARTITION OF TASK. ; R.GSTS=CONTROL INFORMATION. ; RS.TOP=1 IF REGION SHOULD BE ALLOCATED TOP DOWN ; IN MEMORY (ONLY IF RS.RES ALSO SET) ; RS.RES=1 IF REGION SHOULD BE CREATED ONLY IF ; MEMORY IS AVAILABLE NOW ; RS.NDL=1 IF REGION SHOULD NOT BE DELETED ON LAST ; DETACH. ; RS.ATT=1 IF CREATED REGION SHOULD BE ATTACHED. ; RS.RED=1 IF READ ACCESS IS DESIRED ON ATTACH. ; RS.WRT=1 IF WRITE ACCESS IS DESIRED ON ATTACH. ; RS.EXT=1 IF EXTEND ACCESS IS DESIRED ON ATTACH. ; RS.DEL=1 IF DELETE ACCESS IS DESIRED ON ATTACH. ; R.GPRO=PROTECTION CODE FOR REGION [DEWR,DEWR,DEWR,DEWR]. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF A PCB OR ATTACH- ; MENT DESCRIPTOR COULD NOT BE ALLOCATED. ; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THE DIRECTIVE ; FAILS IN THE ATTACHMENT STAGE BECAUSE THE REGION ; HAS INCURRED A PARITY ERROR. ; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE DESIRED ; ACCESS IS DENIED IN THE ATTACHMENT STAGE. ; DIRECTIVE STATUS OF 'D.RS84' IS RETURNED IF THE SPECIFIED ; PARTITION IN WHICH THE REGION IS TO BE ALLOCATED ; DOES NOT EXIST, OR IF NO PARTITION NAME HAS BEEN ; SPECIFIED AND RS.ATT=0. ; ; OUTPUT FIELDS IN THE REGION DEFINITION BLOCK ARE: ; R.GID=ASSIGNED REGION ID (RS.ATT=1). ; R.GSTS=DIRECTIVE COMPLETION INFORMATION. ; RS.CRR=1 IF REGION WAS CREATED. ; ; NOTE: ON SYSTEMS SUPPORTING EXTERNAL HEADERS, THE RDB ; IS COPIED TO AN EXECUTIVE BUFFER SO THAT APR6 ; CAN BE USED TO MAP THE TASK HEADER EXCLUSIVELY. ; THIS MEANS THAT ANY OUTPUT FIELDS ARE RETURNED ; TO THE USER TASK FROM THE DIRECTIVE DISPATCHER. ; ; ALSO, WHEN RETURNING REGION SIZE FROM AN ATTACH ; EXCLUDE THE SIZE OF THE NON RESIDENT TASK HEADER. ; ;- .ENABL LSB 1$: DRSTS D.RS94 ;PARTITION NAME ERROR $DRCRR::ADD #R.GPAR,R3 ;PNT TO NAME OF PAR IN WHICH TO ALLOCATE MOV T.PCB(R5),R2 ;ASSUME ALLOCATING IN TASK'S PARTITION MOV P.MAIN(R2),R2 ;POINT TO MAIN PARTITION PCB TST (R3) ;PARTITION NAME SPECIFIED? BEQ 5$ ;IF EQ NO CALL $SRMAI ;SEARCH FOR NAMED PARTITION'S PCB BCS 1$ ;IF CS, PARTITION NOT IN SYSTEM CMP R2,P.MAIN(R2) ;IS IT A MAIN PARTITION? BNE 1$ ;IF NE NO .IF DF M$$EXT CMP P.REL(R2),#177600 ;DEVICE PARTITION? .IFF CMP P.REL(R2),#7600 ;DEVICE PARTITION? .ENDC BHIS 1$ ;YES, IF HIS BIT #P2.LMA!P2.SEC!P2.CPU,P.ST2(R2) ;SPECIAL PARTITION? BNE 1$ ;IF NE YES, DON'T ALLOW CREATE 5$: MOV R2,R0 ;COPY POINTER TO PCB TST -(R3) ;POINT TO REGION NAME (R.GNAM+2) TST -(R3) ;REGION NAME SPECIFIED? (R.GNAM) BEQ 10$ ;IF EQ NO CALL $SRNAM ;DETERMINE IF NAME IS UNIQUE BCC 35$ ;IF CC, NAME IS NOT UNIQUE 10$: ;REF SYMBOL .IF DF M$$PRO CLR -(SP) ;CLEAR REQUIRED RUN MASK WORD .ENDC CLR -(SP) ;CLR HDR SIZE AND I/O CNT (P.HDLN/P.IOC) MOV R3,-(SP) ;PUSH NON-ZERO WORD (P.ATT+2) CLR -(SP) ;(P.ATT) MOV R.GPRO-R.GNAM(R3),-(SP) ;SET PROTECTION MASK (P.PRO) BIC #210,(SP) ;INSURE OWNER AND SYSTEM DELETE ACCESS (P.PRO) MOV #P2.PIC,-(SP) ;INIT SECOND WORD (P.ST2) MOV #PS.COM!PS.OUT,-(SP) ;INIT STATUS WORD (P.STAT) MOV H.CUIC(R4),-(SP) ;SET OWNER UIC (P.OWN) CLR -(SP) ;CLEAR DISK PCB POINTER (P.DPCB) MOV R.GSIZ-R.GNAM(R3),-(SP) ;STORE SIZE OF REGION (P.SWSZ) CMP (SP),P.SIZE(R0) ;CREATING REGION LARGER THAN MAIN? BHI 120$ ;IF HI YES CLR -(SP) ;CLR COMMON BLK DIRECTORY LINK (P.CBDL) MOV R.GSIZ-R.GNAM(R3),-(SP) ;STORE SIZE OF REGION (P.SIZE) CLR -(SP) ;CLEAR RELOCATION BIAS (P.REL) MOV R0,-(SP) ;SET MAIN PCB POINTER (P.MAIN) CLR -(SP) ;CLEAR SUBPARTITION LINK (P.SUB) MOV 2(R3),-(SP) ;SET SECOND WORD OF PAR NAME (R.GNAM+2)(P.NAM+2) MOV (R3),-(SP) ;SET FIRST WORD OF PAR NAME (R.GNAM)(P.NAM) BNE 30$ ;IF NE NAME WAS SPECIFIED BIT #RS.ATT,R.GSTS-R.GNAM(R3) ;IS REGION TO BE ATTACHED BEQ 90$ ;IF EQ NO, PARTITION NAME ERROR CLR 2(SP) ;ELSE CLEAR SECOND WORD OF NAME (P.NAM+2) 30$: CLR -(SP) ;ZERO PRIORITY AND MAP COUNT (P.PRI) CLR -(SP) ;CLEAR LINK WORD (P.LNK) BIT #RS.RES,R.GSTS-R.GNAM(R3) ;CREATE ONLY IF RESIDENT? BEQ 34$ ;IF EQ NO, PROCEED MOV SP,R4 ;POINT TO PCB ON STACK MOV P.MAIN(R4),R5 ;POINT TO MAIN PARTITION MOV #$FNDSP,-(SP) ;ASSUME WE CAN USE NORMAL ROUTINE BIT #RS.TOP,R.GSTS-R.GNAM(R3) ;WANT TOP DOWN ALLOCATION? BEQ 33$ ; YES, USE NORMAL ROUTINE MOV #$ALTOP,(SP) ; ELSE, USE TOP DOWN ALLOCATION ALGORITHM 33$: CALL @(SP)+ ;ATTEMPT TO FIND SPACE IN PARTITION BCS 121$ ;IF CS, COULDN'T ALLOCATE - RETURN IE.ALG MOV R1,P.SUB(R0) ;UNLINK STACK PCB FROM PARTITION LIST MOV R0,P.SUB(R4) ;AND SAVE POINTER TO WHERE IT BELONGS MOV $SAHPT,R4 ;RESTORE POINTER TO HEADER MOV $TKTCB,R5 ;RESTORE POINTER TO CURRENT TCB 34$: MOV SP,R2 ;COPY POINTER TO PCB ON STACK 35$: BIT #RS.ATT,R.GSTS-R.GNAM(R3) ;ATTACH DESIRED? BEQ 36$ ;IF EQ NO CALL ATT ;ATTACH REGION 36$: TST (SP) ;WAS THE REGION CREATED? BNE 81$ ;IF NE NO, DONE MOV R1,R5 ;COPY POINTER TO ATTACHMENT DESCRIPTOR MOV #P.LGTH,R1 ;PICK UP PCB SIZE CALL $ALOCB ;ALLOCATE A PCB BCS 110$ ;IF CS ALLOCATION FAILURE MOV #P.LGTH/2,R1 ;PICK UP PCB SIZE IN WORDS MOV R0,R4 ;COPY POINTER TO PCB 40$: MOV (SP)+,(R0)+ ;FILL IN PCB DEC R1 ;DONE YET? BGT 40$ ;IF GT NO .IF DF M$$PRO TST -(R0) ;SKIP REQUIRED RUN MASK WORD .ENDC TST -(R0) ;SKIP XTRNL HDR SIZE AND I/O COUNT CMP -(R0),-(R0) ;WAS THE PCB ATTACHED? BEQ 50$ ;IF EQ YES MOV R0,2(R0) ;SET UP LISTHEAD CMP -(R3),-(R3) ;POINT TO REGION ID (R.GSIZ)(R.GID) BR 60$ ; 50$: MOV (R0),R5 ;PICK UP ADDRESS OF ATTACHMENT DESCRIPTOR MOV R4,A.PCB(R5) ;POINT IT TO THE REAL PCB 60$: TST P.NAM(R4) ;NAMED COMMON? BEQ 75$ ;IF EQ NO MOV #$CBDHD-P.CBDL,R0 ;POINT TO CBD LISTHEAD AS PCB 65$: MOV R0,R1 ;SAVE POINTER TO PREVIOUS MOV P.CBDL(R0),R0 ;POINT TO NEXT ENTRY IN CBD BEQ 71$ ;IF EQ THERE IS NONE CMP P.NAM(R4),P.NAM(R0) ;TEST TO SEE IF IT GOES HERE BNE 70$ ; CMP P.NAM+2(R4),P.NAM+2(R0) ; 70$: BHI 65$ ;IF HI IT DOESN'T GO HERE 71$: MOV R0,P.CBDL(R4) ;POINT NEW ONE TO NEXT IN LIST MOV R4,P.CBDL(R1) ;POINT PREV TO NEW ONE 75$: BIS #RS.CRR,R.GSTS(R3) ;INDICATE REGION WAS CREATED BIT #RS.NDL,R.GSTS(R3) ;IS NO DELETION DESIRED? BNE 80$ ;IF NE NO BIS #PS.DEL,P.STAT(R4) ;SET DELETE ON LAST DETACH BIT 80$: MOV P.SUB(R4),R1 ;WAS SPACE ALLOCATED FOR THE REGION? BEQ 81$ ;IF EQ NO, RETURN SUCCESS MOV P.SUB(R1),P.SUB(R4) ;SET POINTER TO NEXT IN NEW PCB BIC #PS.OUT,P.STAT(R4) ;SET PARTITION IN MEMORY MOV R4,P.SUB(R1) ;AND LINK US IN 81$: RETURN ;SUCCESS 90$: DRSTS D.RS94 ;PARTITION NAME ERROR 110$: TST P.ATT(SP) ;WAS REGION ATTACHED? BEQ 120$ ;IF EQ NO MOV (R3),R5 ;POINT TO ATT DESCR TO DETACH (R.GID) MOV SP,P.NAM(SP) ;SET NAME TO AVOID DELETION CALL $DETRG ;DETACH THE REGION 120$: DRSTS D.RS1 ;ALLOCATION FAILURE 121$: DRSTS D.RS84 ;COULDN'T FIT IT IN PARTITION ;+ ; **-$DRATR-ATTACH REGION ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ATTACH THE SPECIFIED REGION ; TO THE CURRENT TASK. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(57.),DPB SIZE(2.) ; WD. 01 -- ADDRESS OF REGION DEFINITION BLOCK ; ; INPUTS: ; ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE REGION DEFINITION BLOCK. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; INPUT FIELDS IN THE REGION DEFINITION BLOCK ARE: ; R.GNAM=NAME OF REGION TO ATTACH TO. ; R.GSTS=DESIRED ACCESS TO REGION. ; RS.RED=1 IF READ ACCESS IS DESIRED. ; RS.WRT=1 IF WRITE ACCESS IS DESIRED. ; RS.EXT=1 IF EXTEND ACCESS IS DESIRED. ; RS.DEL=1 IF DELETE ACCESS IS DESIRED. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF AN ATTACHMENT ; DESCRIPTOR CANNOT BE ALLOCATED. ; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THE SPECIFIED ; REGION HAS INCURRED A PARITY ERROR. ; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE DESIRED ; ACCESS IS DENIED. ; DIRECTIVE STATUS OF 'D.RS94' IS RETURNED IF THE ; SPECIFIED REGION DOES NOT EXIST. ; ; OUTPUT FIELDS IN THE REGION DEFINITION BLOCK ARE: ; R.GID=ASSIGNED REGION ID. ; R.GSIZ=SIZE OF ATTACHED REGION. ;- $DRATR::ADD #R.GNAM,R3 ;POINT TO SPECIFIED REGION NAME TST (R3) ;REGION NAME SPECIFIED? BEQ 90$ ;IF EQ NO, ILLEGAL CALL $SRNAM ;SEARCH FOR NAMED REGION BCS 90$ ;IF CS NAMED REGION DOES NOT EXIST ATT: BIT #PS.PER,P.STAT(R2) ;PARITY ERROR? BNE 170$ ;IF NE YES CMP R2,P.MAIN(R2) ;IS IT A MAIN PARTITION? BEQ 90$ ;IF EQ YES, ERROR MOV R.GSTS-R.GNAM(R3),R0 ;PICK UP STATUS WORD BIT #17,R0 ;ATTACH DESIRED? BNE 147$ ;IF NE YES MOV T.ATT(R5),R1 ;POINT TO FIRST ATTACHMENT DESCRIPTOR 146$: SUB #A.TCBL,R1 ;POINT TO START OF DESCRIPTOR CMP A.PCB(R1),R2 ;ATTACHED TO THIS PCB? BEQ 155$ ;IF EQ YES MOV A.TCBL(R1),R1 ;POINT TO NEXT ATTACHMENT DESCRIPTOR BNE 146$ ;IF NE THERE IS ONE DRSTS D.RS86 ;NO SUCH REGION ID 147$: MOV H.CUIC(R4),R1 ;PICK UP CURRENT TASK UIC MOV R0,R4 ;COPY STATUS WORD CMP R2,#$STACK ;IS REGION BEING CREATED ? BLO 150$ ;IF LO YES, SKIP PROTECTION CHECK BIT #T3.PRV,T.ST3(R5) ;ISSUING TASK PRIVILEGED? BNE 150$ ;IF NE YES, SKIP ACCESS CHECK CALL $CKACC ;DETERMINE IF DESIRED ACCESS IS ALLOWED 150$: CALL $CRATT ;CREATE ATT DESCRIPTOR AND LINK IT IN BCS 160$ ;IF CS ALLOCATION FAILURE 155$: MOV P.SIZE(R2),-(R3) ;RETURN SIZE OF REGION (R.GSIZ) .IF DF X$$HDR MOVB P.HDLN(R2),R5 ;GET SIZE OF EXTERNAL HEADER (IF ANY) SUB R5,(R3) ;EXCLUDE HEADER FROM REGION SIZE .ENDC ;DF X$$HDR MOV R1,-(R3) ;STORE DESCRIPTOR ADDR AS REG ID (R.GID) RETURN ; 160$: DRSTS D.RS1 ;ALLOCATION FAILURE 170$: DRSTS D.RS6 ;PARITY ERROR .DSABL LSB ;+ ; **-$ALTOP-Allocate region top down in partition ; ; This routine will attempt to allocate space for a region ; in a top down manner in the specified partition. ; ; Input: ; R4 - PCB to insert ; R5 - Address of main PCB ; Output: ; CC-C clear, region inserted into PCB list ; R0 - Previous PCB ; R1 - Next PCB address ; CC-C set, no memory available ; ; R3 preserved ;- $ALTOP: MOV R3,-(SP) ; save register MOV P.REL(R5),R2 ; set high address of prev partition MOV R5,R0 ; set up main as previous PCB CLR -(SP) ; reserve a word on the stack ;+ ; In this area: ; ; R0 = address of previous PCB ; R1 = address of next PCB ; R2 = address of first byte beyond (above) the previous PCB ; R3 = scratch ; R4 = address of new PCB ; R5 = address of main PCB ; ; Look through our partition (from low memory to ; high) for a hole (memory that is not part of a subpartition) ; that is large enough to hold the common. ; ; Allocate the partition into the highest ; (last) such hole. The last hole is remembered by ; saving information in the new PCB. ;- 100$: MOV P.SUB(R0),R1 ; get address of next sub-PCB BEQ 160$ ; No more, end of list ... MOV P.REL(R1),R3 ; Calculate size of hole SUB R2,R3 ; CMP R3,P.BLKS(R4) ; Is it big enough? BLO 140$ ; Nope, update and try again ... MOV R0,(SP) ; set previous address for linkage MOV R1,P.SUB(R4) ; Link this PCB to be our next PCB MOV P.REL(R1),P.REL(R4) ; Make base of common partition SUB P.BLKS(R4),P.REL(R4) ; as high as possible 140$: MOV R1,R0 ; Update this PCB to be previous ... MOV P.REL(R1),R2 ; Calculate base address of next hole ADD P.BLKS(R1),R2 ; BR 100$ ; and try next hole ... 160$: MOV P.REL(R5),R3 ; calculate size of last hole ADD P.BLKS(R5),R3 ; adjust correctly SUB R2,R3 ; CMP R3,P.BLKS(R4) ; is it big enough? BHIS 200$ ; yup, fit it in ... *real high* 180$: MOV (SP)+,R0 ; was a hole found previously? BNE 220$ ; yup, continue ... ;+ ; No main memory available for common partition ... Sorry ... ;- MOV (SP)+,R3 ; restore saved register SEC ; signal error RETURN ; to caller 200$: TST (SP)+ ; clean the stack CLR P.SUB(R4) ; clear our linkage MOV R4,R3 ; copy the PCB address ADD #P.REL,R3 ; and bias to P.REL address MOV P.REL(R5),(R3) ; make the base of the new PCB ADD P.BLKS(R5),(R3) ; as high as possible SUB P.BLKS(R4),(R3) ; adjust to be correct base address 220$: MOV R4,P.SUB(R0) ; and chain us into the real world ... MOV P.SUB(R4),R1 ; and set the next PCB address after us MOV (SP)+,R3 ; restore the saved R3 address 240$: CLC ; clear carry RETURN ; and return to caller ;+ ; **-$DRDTR-DETACH REGION ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO DETACH THE SPECIFIED REGION, ; UNMAPPING IF NECESSARY. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(59.),DPB SIZE(2.) ; WD. 01 -- ADDRESS OF REGION DEFINITION BLOCK ; ; INPUTS: ; ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE REGION DEFINITION BLOCK. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; INPUT FIELDS IN THE REGION DEFINITION BLOCK ARE: ; R.GID=REGION ID OF REGION TO DETACH. ; R.GSTS=CONTROL INFORMATION. ; RS.MDL=1 IF REGION SHOULD BE MARKED FOR DELETE ON ; THE LAST DETACH. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF AN ATTEMPT IS MADE ; TO MARK THE REGION FOR DELETE WITHOUT DELETE ACCESS. ; DIRECTIVE STATUS OF 'D.RS86' IS RETURNED IF AN INVALID REGION ; ID IS SPECIFIED OR IF AN ATTEMPT IS MADE TO DETACH ; REGION 0. ; ; OUTPUT FIELDS IN THE REGION DEFINITION BLOCK ARE: ; R.GSTS=INDICATION OF ANY CHANGES IN MAPPING CONTEXT. ; RS.UNM=1 IF ANY WINDOWS WERE UNMAPPED. ;- .ENABL LSB $DRDTR::CALL $SRATT ;SEARCH FOR AND VERIFY REGION ID TSTB A.IOC(R5) ;ANY I/O INTO REGION? BNE 70$ ;IF NE YES, CAN'T DETACH MOV A.TCB(R5),R1 ;POINT TO TCB MOV R5,R0 ;POINT TO TCB THREAD ADD #A.TCBL,R0 ; CMP R0,T.ATT(R1) ;DETACHING TASK REGION? BEQ 60$ ;IF EQ YES, ILLEGAL MOV A.PCB(R5),R0 ;POINT TO PCB MOV H.WND(R4),R4 ;POINT TO NUMBER OF WINDOW BLOCKS TST (R4)+ ;POINT TO FIRST WINDOW BLOCK BIT #RS.MDL,R.GSTS(R3) ;MARK FOR DELETE DESIRED? BEQ 10$ ;IF EQ NO BITB #AS.DEL,A.STAT(R5) ;DOES TASK HAVE DELETE ACCESS? BEQ 70$ ;IF EQ NO BIS #PS.DEL,P.STAT(R0) ;MARK REGION FOR DELETE 10$: CMP W.BATT(R4),R5 ;THIS WINDOW MAPPED TO REGION TO DETACH BNE 20$ ;IF NE NO CALL $UNMAP ;UNMAP WINDOW BIS #RS.UNM,R.GSTS(R3) ;INDICATE WINDOW WAS UNMAPPED 20$: ADD #W.BLGH,R4 ;POINT TO NEXT WINDOW BLOCK TSTB A.MPCT(R5) ;ANY MORE WINDOWS MAPPED TO THIS REGION? BNE 10$ ;IF NE YES CALLR $DETRG ;DETACH REGION BY ATTACHMENT DESCRIPTOR 60$: DRSTS D.RS86 ;INVALID REGION ID 70$: DRSTS D.RS16 ;ATTEMPT TO MARK FOR DELETE WITHOUT ACCESS .DSABL LSB .ENDC .END